<?php
// +----------------------------------------------------------------------
// | Action: 在线支付控制器
// +----------------------------------------------------------------------
// | Author: chen <vd8888@126.com>
// +----------------------------------------------------------------------
// |   ToDo:
// +----------------------------------------------------------------------
class RechargeAction extends CommonAction{
     // 在类初始化方法中，引入相关类库
    public function _initialize()
    {
         vendor('Alipay.corefunction');
         vendor('Alipay.md5function');
         vendor('Alipay.notify');
         vendor('Alipay.submit');
         }
    /**
     * 已支付列表
     */
     public function index()
    {
         $datas['proxyid'] = $_SESSION["agent"]['id'];
         $datas['ordertype']=array(array('eq',1),array('eq',3), 'or');
         $datas['status']=1;
         $order = D('Order');
         import("ORG.Util.Page");
         $totalnum = $order -> where($datas) -> order('id desc')-> count();
         $list = $order -> page($_GET['p']) -> limit(10) -> where($datas)-> order('id desc')->select();
        
         $this -> assign("list", $list);
         $page = new Page($totalnum, 10);
         $page -> rollPage = 10;
        
         $page -> setConfig("prev", "上一页");
         $page -> setConfig("next", "下一页");
         $page -> setConfig("first", "首页");
         $page -> setConfig("last", "末页");
         $page -> setConfig("theme", "<span class=pageinfo><u></u>当前 %nowPage%/%totalPage%页</span>  %first% %upPage%   %linkPage%  %downPage% %end%");
        
         $pageshow = $page -> show();
         $this -> assign("pageshow", $pageshow);
         $this -> display();
         }
     public function payed ()
    {
         echo $_GET['ordid'];
         $this -> display();
         }
     public function paystart()
    {
         if (I('vMoney') <= 0){
             echo("你知道的太多了!");
             die();
             }
         $datas['proxyid'] = $_SESSION["agent"]['id']; //获取代理商ID
         $agent = M('Proxy');
         $arr_temp = $agent -> where($datas) -> find();
        
         $order = D("order");
         $order -> ordernum = ordernum('OD'); //当前订单号
         $order -> proxyid = $datas['proxyid']; //代理商ID
         $order -> proxyname = $arr_temp['realname']; //代理商真实姓名
         $order -> subject = "代理商充值";
         $order -> body = "代理商支付宝充值:" . I('vMoney') . "元";
         $order -> pstart = $arr_temp['money']; //充值之前余额
         $order -> pend = 0; //充值之后金额
         $order -> money = I('vMoney'); //本次要充值的金额
         $order -> ordertype = 1; //代理商通过支付宝充值
         $order -> status = 0; //未支付状态
         $order -> ip = get_client_ip();
         $order -> addtime = date('Y-m-d H:i:s');
         $order -> isdel = 0; // 正常订单,0为非删除状态
         $orderid = $order -> add();
         if ($orderid){
             $url = '/Recharge/doalipay/orderid/' . $orderid;
             redirect($url);
             }else{
             $errcon = '支付订单创建出错，请稍后重试！';
             $url = '/Index/error/errcon/' . $errcon;
             redirect($url);
             }
         }
     // doalipay方法
    /**
     * 该方法其实就是将接口文件包下alipayapi.php的内容复制过来
然后进行相关处理
     */
    public function doalipay()
    {
         $siteurl = 'http://' . $_SERVER['HTTP_HOST'];
         $alipay_config = C('alipay_config');
         $aliurldata = C('alipay');
         $order = M("order");
         $ordernum = I("get.orderid", "htmlspecialchars");
         $orderinfo = $order -> find($ordernum);
        
         $alipaySubmit = new AlipaySubmit($alipay_config);
        
        /**
         * *************************请求参数*************************
         */
         $payment_type = "1"; //支付类型 //必填，不能修改
        /**
         * $notify_url = $notify_url; //服务器异步通知页面路径
         * $return_url = $return_url; //页面跳转同步通知页面路径
         * $seller_email = $seller_email; //卖家支付宝帐户必填
         */
         $out_trade_no = $orderinfo['id']; //商户订单号 通过支付页面的表单进行��递，注意要唯一！
         $subject = $orderinfo["subject"]; //订单名称 //必填 通过支付页面的表单进行传递
         $total_fee = $orderinfo['money']; //付款金额  //必填 通过支付页面的表单进行传递
         $body = $orderinfo['body']; //订单描述 通过支付页面的表单进行传递
         $show_url = $siteurl . "Recharge/pay.html"; //商品展示地址 通过支付页面的表单进行传递
         $anti_phishing_key = $alipaySubmit -> query_timestamp(); //防钓鱼时间戳
         $exter_invoke_ip = get_client_ip(); //客户端的IP地址
        /**
         */
        
         // 构造要请求的参数数组，无需改动
        $parameter = array(
            "service" => "create_direct_pay_by_user",
             "partner" => trim($alipay_config['partner']),
             "payment_type" => $payment_type,
             "notify_url" => $aliurldata["notify_url"],
             "return_url" => $aliurldata["return_url"],
             "seller_email" => $aliurldata["seller_email"],
             "out_trade_no" => $out_trade_no,
             "subject" => $subject,
             "total_fee" => $total_fee,
             "body" => $body,
             "show_url" => $show_url,
             "anti_phishing_key" => $anti_phishing_key,
             "exter_invoke_ip" => $exter_invoke_ip,
             "_input_charset" => trim(strtolower($alipay_config['input_charset']))
            );
         // 建立请求
        $html_text = $alipaySubmit -> buildRequestForm($parameter, "post", "确认");
        
         echo($html_text);
         }
     public function returnurl()
    {
        
         $alipay_config = C('alipay_config');
         $aliurl = C('alipay');
        
         // dump($aliurl);exit;
        $alipayNotify = new AlipayNotify($alipay_config); //计算得出通知验证结果
         $verify_result = $alipayNotify -> verifyReturn();
         if ($verify_result){
             // 验证成功
            // 获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表
            $out_trade_no = $_GET['out_trade_no']; //商户订单号
             $trade_no = $_GET['trade_no']; //支付宝交易号
             $trade_status = $_GET['trade_status']; //交易状态
             $total_fee = $_GET['total_fee']; //交易金额
             $notify_id = $_GET['notify_id']; //通知校验ID。
             $notify_time = $_GET['notify_time']; //通知的发送时间。
             $buyer_email = $_GET['buyer_email']; //买家支付宝帐号；
            
            
             $parameter = array(
                "out_trade_no" => $out_trade_no, // 商户订单编号；
                "trade_no" => $trade_no, // 支付宝交易号；
                "total_fee" => $total_fee, // 交易金额；
                "trade_status" => $trade_status, // 交易状态
                "notify_id" => $notify_id, // 通知校验ID。
                "notify_time" => $notify_time, // 通知的发送时间。
                "buyer_email" => $buyer_email, // 买家支付宝帐号
                "note" => json_encode($_GET),
                );
            
             if ($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS')
            {
                
                
                 if (!$this -> checkorderstatus($out_trade_no))
                    {
                     // orderhandle($parameter); //进行订单处理，并传送从支付宝返回的参数；
                    $order = M("order");
                     $condition["id"] = $out_trade_no;
                     $condition["status"] = 1;
                     $condition["pay_time"] = date("Y-m-d H:m:s");
                     $condition["note"] = "相关支付信息为" . $payid;
                     // 更新订单状态
                    if ($order -> save($condition) === false)
                        {
                         echo "充值失败,请联系管理员,订单编号为:" . $out_trade_no . "支付定交易编号:" . $payid;
                         }else
                        {
                         // 更新用户余额
                        $proxy = M("proxy");
                         $proxyid = $_SESSION["agent"]['id'];
                         $proxydata = $proxy -> find($proxyid);
                         $proxydata["money"] += $total_fee;
                         $proxy -> save($proxydata);
                         }
                     }else
                    {
                     $errcon = "你的订单已经处理过了,请不要重复充值,如有疑问请记录下信息,然后联系管理员,订单编号" . $out_trade_no . "支付信息编号:" . $payid;
                     $url = '/Index/error/errcon/' . $errcon;
                     redirect($url);
                     }
                
                 $pageurl = $aliurl['successpage'];
                 if (substr($pageurl, -1) != '/') $pageurl .= "/";
                 $pageurl .= "ordid/" . $out_trade_no . "/";
                 $this -> redirect($pageurl); //跳转到配置项中配置的支付成功页面；
                 }else
                {
                 echo "trade_status=" . $_GET['trade_status'];
                 $this -> redirect($aliurl['alipay.errorpage']); //跳转到配置项中配置的支付失败页面；
                 }
             }else
            {
             // 验证失败
            // 如要调试，请看alipay_notify.php页面的verifyReturn函数
            echo "验证失败,支付失败！";
             }
         }
    /**
     * 服务器异步通知页面方法
     * 其实这里就是将notify_url.php文件中的代码复制过来进行处理
     */
     public function notifyurl()
    {
         $alidata = C('alipay');
         $alipay_config = C('alipay_config');
         // 算得出通知验证结果
        $alipayNotify = new AlipayNotify($alipay_config);
         $verify_result = $alipayNotify -> verifyNotify();
         if ($verify_result){
             // 验证成功
            // 获取支付宝的返回参数，可参考技术文档中服务器异步通知参数列表
            $out_trade_no = $_POST['out_trade_no']; //商户订单号
             $trade_no = $_POST['trade_no']; //支付宝交易号
             $trade_status = $_POST['trade_status']; //交易状态
             $total_fee = $_POST['total_fee']; //交易金额
             $notify_id = $_POST['notify_id']; //通知校验ID。
             $notify_time = $_POST['notify_time']; //通知的发送时间。格式为yyyy-MM-dd HH:mm:ss。
             $buyer_email = $_POST['buyer_email']; //买家支付宝帐号；
             $parameter = array(
                "out_trade_no" => $out_trade_no, // 商户订单编号；
                "trade_no" => $trade_no, // 支付宝交易号；
                "total_fee" => $total_fee, // 交易金额；
                "trade_status" => $trade_status, // 交易状态
                "notify_id" => $notify_id, // 通知校验ID。
                "notify_time" => $notify_time, // 通知的发送时间。
                "buyer_email" => $buyer_email, // 买��支付宝帐号；
                "note" => json_encode($_POST),
                );
             $alipay = M("alipay");
             $payid = $alipay -> add($parameter);
             if ($_POST['trade_status'] == 'TRADE_FINISHED'){
                
                 }else if ($_POST['trade_status'] == 'TRADE_SUCCESS'){
                 if (!checkorderstatus($out_trade_no)){
                     orderhandle($parameter);
                     // 进行订单处理，并传送从支付宝返回的参数；
                    $order = M("order");
                     $condition["id"] = $out_trade_no;
                     $condition["status"] = 1;
                     $condition["pay_time"] = date("Y-m-d H:m:s");
                     $condition["note"] = "相关支付信息为" . $payid;
                     // 更新订单状态
                    if ($order -> save($condition) === false)
                        {
                         echo "充值失败,请联系管理员,订单编号为:" . $out_trade_no . "支付定交易编号:" . $payid;
                         }else
                        {
                         // 更新用户余额
                        $proxy = M("proxy");
                         $proxyid = I("session.proxyid");
                         $proxydata = $proxy -> find($proxyid);
                         $proxydata["money"] += $total_fee;
                         $proxy -> save($proxydata);
                         }
                     echo "充值成功,请刷新余额";
                     }
                 }
             echo "success"; //请不要修改或删除
             }else{
             // 验证失败
            echo "fail";
             }
         }
     // 当前订单是否已经处理过,如果处理过那么就不在处理了
    function checkorderstatus($out_trade_no)
    {
         $order = M("order");
         $orderinfo = $order -> find($out_trade_no);
         return $orderinfo["status"];
         }
     protected function checkToken()
    {
         if (IS_POST){
             if (!M("order") -> autoCheckToken($_POST)){
                 $this -> error("订单不能重复提交,请回到原来页面,刷新后从新提交");
                 }
             unset($_POST[C("TOKEN_NAME")]);
             }
         }
     }
?>